package com.ht.api.thread;

import java.util.TimerTask;

import com.ht.api.constant.Constants;
import com.ht.api.db.Db;
import com.ht.api.db.Entity;
import com.ht.api.util.AddressUtils;
import com.ht.api.util.IpUtils;
import com.ht.api.util.ServletUtils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 异步工厂（产生任务用）
 * @author asq
 * @createTime 2024年12月20日 21:15:48
 */
@Slf4j
public class AsyncFactory {

	/**
	 * 记录登录信息
	 * @param username 用户名
	 * @param status   状态
	 * @param message  消息
	 * @param args     列表
	 * @return 任务task
	 */
	public static TimerTask recordLogininfor(final String username, final String status, final String message,
			final Object... args) {
		final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
        final String ip = IpUtils.getIpAddr();
		return new TimerTask() {
			@Override
			public void run() {
				String address = AddressUtils.getRealAddressByIP(ip);
				// 获取客户端操作系统
				String os = userAgent.getOs().getName();
				// 获取客户端浏览器
				String browser = userAgent.getBrowser().getName();
				
				// 封装对象
				Entity logininfor = Entity.create("sys_logininfor")
						.set("user_name", username)
						.set("ipaddr", ip)
						.set("login_location", address)
						.set("browser", browser)
						.set("os", os)
						.set("msg", message)
						.set("login_time", DateUtil.now());
						
				// 日志状态
				if (StrUtil.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
					logininfor.set("status", Constants.SUCCESS);
				} else if (Constants.LOGIN_FAIL.equals(status)) {
					logininfor.set("status", Constants.FAIL);
				}
				// 插入数据
				Db.insert(logininfor);
			}
		};
	}

	/**
	 * 操作日志记录
	 * @param operLog 操作日志信息
	 * @return 任务task
	 */
	public static TimerTask recordOper(final Entity operLog) {
		return new TimerTask() {
			@Override
			public void run() {
				// 远程查询操作地点
				String ip = operLog.getStr("oper_ip");
				operLog.set("oper_location", AddressUtils.getRealAddressByIP(ip));
				Db.insert(operLog);
			}
		};
	}
}
